package model;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class BemDAO 
{
	public void incluir(Bem bem) throws SQLException 
	{
		Statement comando = DBConnection.getInstancia().conn.createStatement();
		String query = "INSERT INTO bem VALUES ('" + bem.getId() + "', '" + bem.getTipo() + "', '" + bem.getDescricao() + "')";
		comando.executeUpdate(query);
	}

	public void alterar(Bem bem) throws SQLException
	{
		Statement comando = DBConnection.getInstancia().conn.createStatement();
		String query = "UPDATE bem";
		query += " SET tipo = '" + bem.getTipo() + "', descricao = '" + bem.getDescricao() + "'";
		query += " WHERE id_bem = " + bem.getId();
		comando.executeUpdate(query);
	}

	public boolean excluir(Bem bem) throws SQLException
	{
		Statement comando = DBConnection.getInstancia().conn.createStatement();
		boolean retorno = true;
		int qtdDependentes = 0;
		String query = "";
		ResultSet rs;
		query = "SELECT COUNT(*) as bens FROM parecer WHERE id_bem = " + bem.getId();
		rs = comando.executeQuery(query);
		if (rs.next())
			qtdDependentes += rs.getInt("bens");
		query = "SELECT COUNT(*) as bens FROM garantia WHERE id_bem = " + bem.getId();
		rs = comando.executeQuery(query);
		if (rs.next())
			qtdDependentes += rs.getInt("bens");
		if (qtdDependentes > 0)
			retorno = false;
		else
		{
			query = "DELETE FROM bem WHERE id_bem = " + bem.getId();
			comando.executeUpdate(query);
			query = "DELETE FROM bem_projeto WHERE id_bem = " + bem.getId();
			comando.executeUpdate(query);
		}
		return retorno;
	}

	public ArrayList<Bem> consultar(Bem bem, boolean peloId) throws SQLException
	{
		Statement comando = DBConnection.getInstancia().conn.createStatement();
		ArrayList<Bem> retorno = new ArrayList<Bem>();
		ResultSet rs;
		try
		{
			String query = "SELECT * FROM bem WHERE 1 = 1";
			if (peloId)
			{
				query += " AND id_bem = " + bem.getId();
			}
			else
			{
				if (bem != null)
				{
					if (!(null == bem.getTipo() || bem.getTipo() == ""))
						query += " AND lower(tipo) = lower('" + bem.getTipo() + "')";
					if (!(null == bem.getDescricao() || bem.getDescricao() == ""))
						query += " AND lower(descricao) LIKE lower('%" + bem.getDescricao() + "%')";
				}
			}
			rs = comando.executeQuery(query);
			while (rs.next())
			{
				Bem b = new Bem();
				ArrayList<Projeto> projetos = buscarProjetos(rs.getInt("id_bem"), "");
				b.setId(rs.getInt("id_bem"));
				b.setTipo(rs.getString("tipo"));
				b.setDescricao(rs.getString("descricao"));
				b.setProjetos((projetos.size() == 0) ? null : projetos);
				retorno.add(b);
			}
		}
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
		return retorno;
	}

	public ArrayList<Bem> consultar() throws SQLException 
	{
		Statement comando = DBConnection.getInstancia().conn.createStatement();
		ArrayList<Bem> retorno = new ArrayList<Bem>();
		ResultSet rs;
		try
		{
			String query = "";
			query += "SELECT B.referencia as referencia, C.titulo as titulo, A.*";
			query += "  FROM bem A, bem_projeto B, projeto C";
			query += " WHERE A.id_bem = B.id_bem AND B.referencia = C.referencia";
			query += " ORDER BY C.titulo, A.descricao";
			rs = comando.executeQuery(query);
			while (rs.next()) 
			{
				Bem b = new Bem();
				ArrayList<Projeto> projetos = buscarProjetos(rs.getInt("id_bem"), "");
				b.setId(rs.getInt("id_bem"));
				b.setTipo(rs.getString("tipo"));
				b.setDescricao(rs.getString("descricao"));
				b.setProjetos((projetos.size() == 0) ? null : projetos);
				retorno.add(b);
			}
		}
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
		return retorno;
	}
	
	public ArrayList<Bem> consultar(String[] lista)
			throws SQLException {
		Statement comando = DBConnection.getInstancia().conn.createStatement();
		ArrayList<Bem> retorno = new ArrayList<Bem>();
		// Montar a lista
		String ids = "0";
		for (int i=0;i<lista.length;i++)
			ids += ","+lista[i];
		ResultSet rs;
		try {
			String query = "SELECT * FROM bem WHERE id_bem IN (" + ids + ")";
			rs = comando.executeQuery(query);
			while (rs.next()) {
				Bem b = new Bem();
				b.setId(rs.getInt("id_bem"));
				b.setTipo(rs.getString("tipo"));
				b.setDescricao(rs.getString("descricao"));
				retorno.add(b);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return retorno;
	}

	public ArrayList<String> listarTipos() throws SQLException
	{
		Statement comando = DBConnection.getInstancia().conn.createStatement();
		ArrayList<String> retorno = new ArrayList<String>();
		ResultSet rs;
		try
		{
			String query = "SELECT DISTINCT tipo FROM bem ORDER BY tipo";
			rs = comando.executeQuery(query);
			while (rs.next())
				retorno.add(rs.getString("tipo"));
		}
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
		return retorno;
	}

	public ArrayList<Projeto> buscarProjetos(int id_bem, String referencia) throws SQLException
	{
		Statement comando = DBConnection.getInstancia().conn.createStatement();
		ArrayList<Projeto> retorno = new ArrayList<Projeto>();
		ResultSet rs;
		try
		{
			ClienteDAO objCDAO = new ClienteDAO();
			String query = "SELECT * FROM projeto WHERE referencia IN (SELECT DISTINCT referencia FROM bem_projeto WHERE id_bem = " + id_bem + ")";
			if (!referencia.equals(""))
				query += " AND referencia = '" + referencia + "'";
			rs = comando.executeQuery(query);
			while (rs.next())
			{
				Projeto p = new Projeto();
				Cliente cliente = objCDAO.consultar((new Cliente(rs.getString("cnpj"))), true).get(0);
				p.setAno(rs.getInt("ano"));
				p.setReferencia(rs.getString("referencia"));
				p.setTitulo(rs.getString("titulo"));
				p.setCliente(cliente);
				retorno.add(p);
			}
			query += " ORDER BY titulo";
		}
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
		return retorno;
	}
}